home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
COMMUNIC
/
H191.ZIP
/
CA29-3.EXE
/
XLATE.CMD
< prev
Wrap
OS/2 REXX Batch file
|
1990-06-21
|
15KB
|
638 lines
; ----- COM-AND Edit transation tables
;
; This script opens a window and allows the editing of translation
; tables. COM-AND supports two transations: incoming and outgoing.
; The first 128 bytes of the incoming table are displayed on entry.
;
; The incoming table is 256 entries. The outgoing table is the same
; size. The 'n'th position represents the translation value for the
; character with value 'n'.
;
; Translation may be enabled here in this script - and in COM-AND's
; Alt-V emulations.
;
; R.McG, commenced 1/89
; ----- Usages -----------------
; S19 -----> COM-AND.XLT file name to be used
; S10-S17 -> The file loaded into memory
; N99 -----> Display page (0,1,2,3)
; FLAG(9) -> Hex/decimal switch
; FLAG(8) -> Modification to file
; ------------------------------
; Initialization
;
;* TRACE ON
ON ESCAPE GOSUB Exit ; SAVE is performed in Window
LEGEND " Edit translations"
SET TTHRU OFF ; Disallow typeahead
N99 = 0 ; Base of current window
SET FLAG(9) OFF ; Hex/decimal flag (true = hex)
SET FLAG(8) OFF ; Modification flag
;
; Initialize, and paint an initial window
;
GOSUB Set_Fname ; S19 -> target file
UPPER S19 ; .. make nice
GOSUB Load ; Load values
GOSUB Window ; Open the window
;
; Main-loop - look for keyentry
;
Main_Loop:
ATSAY 22,11 (default) " "
LOCATE 22,11
KEYGET S0 ; Get a keystroke
;
; Act upon the keystroke
;
SWITCH S0
CASE "4900" ; Pgup
GOTO PgUp
ENDCASE
CASE "5100" ; PgDn
GOTO PgDn
ENDCASE
CASE "4700" ; Home
GOTO Home
ENDCASE
CASE "4F00" ; End
GOTO End
ENDCASE
CASE "H" ; H)ex
SET FLAG(9) ON
GOSUB DISPPAGE
GOTO Main_Loop
ENDCASE
CASE "D" ; D)ecimal
SET FLAG(9) OFF
GOSUB DISPPAGE
GOTO Main_Loop
ENDCASE
CASE "S" ; S)ave
GOSUB Store
GOTO Main_Loop
ENDCASE
CASE "N" ; S)ave
IF FLAG(8)
GOSUB Store ; Save on disk
SET FLAG(8) OFF
ENDIF
SET TRAN ON
GOTO Main_Loop
ENDCASE
CASE "F" ; S)ave
SET TRAN OFF
GOTO Main_Loop
ENDCASE
ENDSWITCH
;
; Begin numeric entry
;
IF NOT NULL S0(1:3) ; Disallow other special keys
SOUND 100,100
GOTO Main_Loop
ENDIF
GOSUB Enter ; Enter #
GOTO Main_Loop ; And continue
;
; ----- Page up (cycle backwards through possible values)
;
PgUp:
DEC N99
IF LT N99 0
N99 = 3
ENDIF
GOSUB DispPage
GOTO Main_Loop
;
; ----- Page down (cycle forwards through possible values)
;
PgDn:
INC N99
IF GT N99 3
N99 = 0
ENDIF
GOSUB DispPage
GOTO Main_Loop
;
; ----- Home (move to first line)
;
Home:
N99 = 0
GOSUB DispPage
GOTO Main_Loop
;
; ----- End (Move to last line)
;
End:
N99 = 3
GOSUB DispPage
GOTO Main_Loop
;
; ----- Subroutine Exit - terminate the process
;
Exit:
IF FLAG(8) ; If table modified
GOSUB Ask_Save ; Ask if to save
ENDIF
DO ; CLose any open windows
WCLOSE
UNTIL FAILURE
EXIT
;
; ----- Subroutine: Enter a value
; .. on entry S0 -> The first keystroke
; .. S9 within this subroutine the field being constructed
; .. N6 within this subroutine is an index to field being constructed
;
Enter:
N6 = 0 ; Index to field being built
S9 = "" ; Clear field
UPPER S0 ; Make upper case
CTOI S0 N0 ; Easier comparison
IF NOT ((GE N0 48 and LE N0 57) or EQ N0 88) ; Allow 0-9 and 'x'
SOUND 100,100
RETURN
ENDIF
CURSOR N0,N1
INC N1
LOCATE N0,N1
GOTO Keyin
;
; Accept another keypress
;
Keypress:
KEYGET S0 ; Get more from keybd
;
; Catch backspace (and equivalent cursor left) here
;
Keyin:
IF STRCMP S0 "08" or STRCMP S0 "4B00"; Backspace or cursor left
IF GT N6 0
CURSOR N0,N1
ATSAY N0,N1 (default) "^H"
DEC N6
ENDIF
IF EQ N6 0
RETURN ; Nop at this pt
ENDIF
GOTO Keypress
ENDIF
;
; Catch carriage return (and equivalent space/tab) here
;
IF STRCMP S0 "0D" or STRCMP S0 " " or STRCMP S0 "09" ; cr, space, tab
IF EQ N6 0 ; Look for nothing done
RETURN ; Empty field
ENDIF
GOTO End_Entry ; Done - try to convert it
ENDIF
;
; Other control keys abort entry
;
IF NOT NULL S0(1:3) ; If a special key
GOTO Abort_Entry ; Exit on special key
ENDIF
;
; Filter only 0-9, a-f, and 'x' here
;
UPPER S0 ; Make upper case
CTOI S0 N0 ; Easier comparison
IF NOT ((GE N0 48 and LE N0 57) or (GE N0 65 and LE N0 70) or EQ N0 88)
SOUND 100,100
GOTO Keypress
ENDIF
;
; Add the character to the string being constructed
;
CURSOR N0,N1
ATSAY N0,N1 (default) S0
INC N1
LOCATE N0,N1
S9(N6:N6) = S0 ; Add the key
INC N6 ; Add to index
GOTO Keypress ; And continue
;
; Abort entry and return to main
;
Abort_Entry:
RETURN
;
; Error in entry
;
Entry_Error:
SOUND 400,100
RETURN
;
; End of entry - catch empty field
;
End_Entry:
IF EQ N6 0 ; EMpty field
RETURN
ENDIF
;
; Convert a leading 'x' into '0x'
;
IF STRCMP S9(0:0) "X" ; 'x' in col 0
S9 = "0"&S9 ; Add an initial 0
ENDIF
;
; Try to convert the char
;
ATOI S9 N0 ; Convert
IF ERROR or (LT N0 0 or GT N0 255)
GOTO Entry_Error ; .. indicate error
ENDIF
;
; Lookup the value obtained
;
GOSUB Get_Value ; Using N0, get its translation into N1
S0 = "Char %03d (x%02x) currently translates to %03d (x%02x)"
STRFMT S1 S0 N0,N0 N1,N1 ; Construct prompt
;
; Open a window for the entry of the translation
;
WOPEN 19,0, 22,78 (default) TenterXIT
ATSAY 20,2, (default) S1 ; D
ATSAY 21,2 (default) "New translation: "
ATSAY 22,28 (default) " Press ESC to cancel "
;
; Ask for the translation
;
Tenter:
ATGET 21,19 (default) 4 S0 ; Get new translation
;
; Catch empty response (Tenter_ESC also clears S0)
;
IF NULL S0 ; EMpty field
WCLOSE ; Drop window
RETURN
ENDIF
;
; Convert a leading 'x' into '0x'
;
IF STRCMP S0(0:0) "X" ; 'x' in col 0
S0 = "0"&S0 ; Add an initial 0
ENDIF
;
; Try to convert the char
;
ATOI S0 N1 ; Convert
IF ERROR or (LT N1 0 or GT N1 255)
SOUND 400,100
GOTO Tenter ; .. Try again
ENDIF
;
; We have a value (N0 translating into N1)
;
WCLOSE
SET FLAG(8) ON ; Mark updated
GOSUB Set_Value
;
; Redisplay the line or page modified
;
N3 = N0/128 ; N3 -> page #
IF GE N99 2 ; N99 -> incoming/outgoing
N3 = N3+2
ENDIF
IF NE N3 N99
N99 = N3 ; Set new page no
GOSUB DispPage ; Display the new page
ELSE
N98 = N0 & 15 ; Make N98 = 0-15
GOSUB DispLine ; Just redo the line (n98 = lineno)
ENDIF
RETURN
;
; ----- Escape during entry routine
;
TenterXit:
S0 = "" ; Null input field
RETURN
;
; ----- Get a translation value
; On entry N0 -> the char being translated
; On exit N1 <- the translation
;
Get_Value:
N3 = N0/64 ; Mask string # (0-3)
IF GE N99 2 ; Decide incoming/outgoing
N3 = N3+4 ; Sel within incoming/outgoing tables
ENDIF
SWITCH N3 ; Switch on string # (0-7)
CASE 0
S0 = S10
ENDCASE
CASE 1
S0 = S11
ENDCASE
CASE 2
S0 = S12
ENDCASE
CASE 3
S0 = S13
ENDCASE
CASE 4
S0 = S14
ENDCASE
CASE 5
S0 = S15
ENDCASE
CASE 6
S0 = S16
ENDCASE
CASE 7
S0 = S17
ENDCASE
ENDSWITCH
CTOI S0(N0&63) N1
RETURN
;
; ----- Store a translation value
; On entry N0 -> the char being translated
; N1 -> the translation
;
Set_Value:
N3 = N0/64 ; Mask string # (0-3)
IF GE N99 2 ; Decide incoming/outgoing
N3 = N3+4 ; Sel within incoming/outgoing tables
ENDIF
SWITCH N3 ; Switch on string # (0-7)
CASE 0
ITOC N1 S10(N0&63)
ENDCASE
CASE 1
ITOC N1 S11(N0&63)
ENDCASE
CASE 2
ITOC N1 S12(N0&63)
ENDCASE
CASE 3
ITOC N1 S13(N0&63)
ENDCASE
CASE 4
ITOC N1 S14(N0&63)
ENDCASE
CASE 5
ITOC N1 S15(N0&63)
ENDCASE
CASE 6
ITOC N1 S16(N0&63)
ENDCASE
CASE 7
ITOC N1 S17(N0&63)
ENDCASE
ENDSWITCH
RETURN
;
; ----- Construct the file name we'll use for COM-AND.XLT
;
Set_Fname:
S19 = "COM-AND.XLT" ; Default to current subdir
IF ISFILE S19 ; Look for file on default subdir
RETURN ; Exit here
ENDIF
;
; ----- Construct the file with the COM-AND= pathing (if provided)
;
ENVIRON S1 "COM-AND=" ; Look for COM-AND= environment var
IF FOUND ; If environment variable found
LENGTH S1 N0 ; Get its length
N0 = N0-1 ; Point to last char in string
IF not STRCMP S1(n0:n0) "\"
N0 = N0+1
CONCAT S1(n0) "\"
ENDIF
ENDIF
S19 = S1&"COM-AND.XLT" ; Concatenate path and name
RETURN
;
; ----- Subroutine: error
; .. Open a window, display, and and await keypress
; S0,S1 pass the message(s) to display
;
Error:
WOPEN 10,1, 13,77 (contrast) ErrEsc
ATSAY 11, 3 (contrast) S0(0:73)
ATSAY 12, 3 (contrast) S1(0:73)
ATSAY 13,26 (contrast) " Press any key to continue "
SOUND 880,100
KEYGET S0 ; Wait for any key
WCLOSE ; Restore screen under
RETURN ; And return to caller
;
; Escape during "Error" window
;
ErrEsc:
RETURN ; And return to KEYGET above
;
; ----- Load the current table
; .. first, dummy values
;
Load:
FOR N0=0,31
ITOC N0 S10(N0:N0)
ITOC (N0+64) S11(N0:N0)
ITOC (N0+128) S12(N0:N0)
ITOC (N0+192) S13(N0:N0)
ITOC N0+32 S10(N0+32)
ITOC (N0+96) S11(N0+32)
ITOC (N0+160) S12(N0+32)
ITOC (N0+224) S13(N0+32)
ENDFOR
S14 = S10
S15 = S11
S16 = S12
S17 = S13
;
; If the file doesn't exist, no error
;
IF NOT ISFILE S19
GOTO LOADXIT
ENDIF
;
; Open the file
;
FOPENI S19 BINARY ; Open as a binary file
IF FAILED ; If error openeing it...
S0 = "Error opening file for loading"
S1 = S19
GOSUB Error ; Display error message
RETURN
ENDIF
;
; Read the file into 8 string variables
; .. File is opened binary!
;
READ S10 64 N0 ; Read 64 bytes
READ S11 64 N0 ; Read 64 bytes
READ S12 64 N0 ; Read 64 bytes
READ S13 64 N0 ; Read 64 bytes
READ S14 64 N0 ; Read 64 bytes
READ S15 64 N0 ; Read 64 bytes
READ S16 64 N0 ; Read 64 bytes
READ S17 64 N0 ; Read 64 bytes
FCLOSEI ; Close the file
LoadXit:
RETURN ; And we're done
;
; ----- Subroutine: Ask if modifications are to be saved
; .. Open a window, display, and and await keypress
; S0,S1 pass the message(s) to display
;
Ask_Save:
WOPEN 10,1, 12,77 (contrast) AskEsc
ATSAY 11, 3 (contrast) "Do you wish to save changes? (y/n): "
ATSAY 12,29 (contrast) " Press ESC to exit "
SOUND 880,100
Ask_Again:
ATGET 11,40 (contrast) 1 S0
SWITCH S0
CASE "Y"
GOSUB Store ; Save current values
ENDCASE
CASE "N"
ENDCASE
DEFAULT
SOUND 100,100
GOTO Ask_Again ; None of the above
ENDCASE
ENDSWITCH
WCLOSE ; Restore screen under
RETURN ; And return to caller
;
; Escape during "Ask" window
;
AskEsc:
S0 = "N" ; Fake a 'n'
RETURN ; And return to KEYGET above
;
; ----- Store the table as composed.
; .. First, Open the file
;
Store:
FOPENO S19 BINARY ; Open the file name so constructed
IF FAILED ; If error openeing it...
S0 = "Error opening file for update"
S1 = S19
GOSUB Error ; Display error message
RETURN
ENDIF
;
; Write the file from the 8 string variables
; .. File is opened binary!
;
WRITE S10 64
WRITE S11 64
WRITE S12 64
WRITE S13 64
WRITE S14 64
WRITE S15 64
WRITE S16 64
WRITE S17 64
FCLOSEO ; Close the file
RETURN ; And we're done
;
; ----- Format the current page for display
; .. First, Display the Incoming/outgoing legend
;
DispPage:
SWITCH N99 ; Switch on current page
CASE 0
S0 = "Incoming translations"
ENDCASE
CASE 1
S0 = "Incoming translations"
ENDCASE
CASE 2
S0 = "Outgoing translations"
ENDCASE
CASE 3
S0 = "Outgoing translations"
ENDCASE
DEFAULT ; N99 buggerred
RETURN ; Leave display blank
ENDCASE
ENDSWITCH
ATSAY 1,2 (default) S0 & ", from file "*S19
;
; Now, build lines and display 'em
;
FOR N98 = 0,15 ; 16 rows of 8 columns
GOSUB DispLine
ENDFOR
RETURN ; And we're done
;
; ----- Display a single line
; N99 -> 0,1,2,3 display page
; N98 -> The line number (0-15)
;
DispLine:
SWITCH N99 ; Switch on current page
CASE 0
S0 = S10
S1 = S11
ENDCASE
CASE 1
S0 = S12
S1 = S13
ENDCASE
CASE 2
S0 = S14
S1 = S15
ENDCASE
CASE 3
S0 = S16
S1 = S17
ENDCASE
DEFAULT ; N99 buggerred
RETURN ; Leave display blank
ENDCASE
ENDSWITCH
;
; Now, build a line and display it
;
N10 = N98 ; Even page # 1st lnno
IF NOT ZERO (N99&1) ; Odd/even base page #
N10 = N98+128 ; Odd page # 1st line #
ENDIF
FOR N9=1,8
N10[N9] = N10[N9-1]+16 ; N11-N17
ENDFOR
CTOI S0(N98) N0
CTOI S0(N98+16) N1
CTOI S0(N98+32) N2
CTOI S0(N98+48) N3
CTOI S1(N98) N4
CTOI S1(N98+16) N5
CTOI S1(N98+32) N6
CTOI S1(N98+48) N7
IF FLAG(9) ; T -> Hex
S2 = "x%02x:x%02x x%02x:x%02x x%02x:x%02x x%02x:x%02x"
ELSE
S2 = "%03d:%03d %03d:%03d %03d:%03d %03d:%03d"
ENDIF
STRFMT S3 S2 N10,N0, N11,N1, N12,N2, N13,N3
ATSAY N98+2,3 (default) S3
STRFMT S3 S2 N14,N4, N15,N5, N16,N6, N17,N7
ATSAY N98+2,3+37 (default) S3
RETURN ; And we're done
;
; ----- Open a window with blank fields
;
Window:
WOPEN 0,0 23,78 (Default)
ATSAY 0,2 (default) " COM-AND Translates "
ATSAY 18,0 (default) "├─────────────────────────────────────────────────────────────────────────────┤"
ATSAY 19,3 (default) "PgUp, PgDn, Home, End through table(s); H)ex, D)ecimal, S)ave, oN), oF)f;"
ATSAY 20,3 (default) "Or enter a value (decimal or hex) to modify."
ATSAY 21,0 (default) "├─────────────────────────────────────────────────────────────────────────────┤"
ATSAY 22,3 (default) "Select: "
ATSAY 23,30 (default) " Press ESC to exit "
GOSUB DispPage
RETURN